home *** CD-ROM | disk | FTP | other *** search
/ Macwelt 1 / Macwelt DVD 1.toast / Software für Mac-OS X / Entwickler-Tools / netbeans / modules / ext / djava.jar / koala / dynamicjava / interpreter / TreeInterpreter.class (.txt) < prev    next >
Encoding:
Java Class File  |  2000-03-14  |  12.5 KB  |  491 lines

  1. package koala.dynamicjava.interpreter;
  2.  
  3. import java.io.File;
  4. import java.io.FileReader;
  5. import java.io.IOException;
  6. import java.io.InputStream;
  7. import java.io.InputStreamReader;
  8. import java.io.Reader;
  9. import java.lang.reflect.Field;
  10. import java.lang.reflect.Modifier;
  11. import java.net.MalformedURLException;
  12. import java.net.URL;
  13. import java.util.HashMap;
  14. import java.util.Iterator;
  15. import java.util.LinkedList;
  16. import java.util.List;
  17. import java.util.ListIterator;
  18. import java.util.Map;
  19. import java.util.Set;
  20. import koala.dynamicjava.interpreter.context.Context;
  21. import koala.dynamicjava.interpreter.context.GlobalContext;
  22. import koala.dynamicjava.interpreter.context.MethodContext;
  23. import koala.dynamicjava.interpreter.context.StaticContext;
  24. import koala.dynamicjava.interpreter.error.ExecutionError;
  25. import koala.dynamicjava.interpreter.throwable.ReturnException;
  26. import koala.dynamicjava.parser.wrapper.ParseError;
  27. import koala.dynamicjava.parser.wrapper.ParserFactory;
  28. import koala.dynamicjava.parser.wrapper.SourceCodeParser;
  29. import koala.dynamicjava.tree.FormalParameter;
  30. import koala.dynamicjava.tree.MethodDeclaration;
  31. import koala.dynamicjava.tree.Node;
  32. import koala.dynamicjava.util.ImportationManager;
  33. import koala.dynamicjava.util.LibraryFinder;
  34.  
  35. public class TreeInterpreter implements Interpreter {
  36.    protected static Map methods = new HashMap();
  37.    protected static Map constructorParameters = new HashMap();
  38.    protected static int nClass;
  39.    protected ParserFactory parserFactory;
  40.    protected LibraryFinder libraryFinder = new LibraryFinder();
  41.    protected TreeClassLoader classLoader;
  42.    List localMethods = new LinkedList();
  43.    List localConstructorParameters = new LinkedList();
  44.    protected Context nameVisitorContext;
  45.    protected Context checkVisitorContext;
  46.    protected Context evalVisitorContext;
  47.    // $FF: synthetic field
  48.    private static Class class$Lkoala$dynamicjava$interpreter$error$CatchedExceptionError;
  49.  
  50.    public Object interpret(Reader var1, String var2) throws InterpreterException {
  51.       try {
  52.          SourceCodeParser var3 = this.parserFactory.createParser(var1, var2);
  53.          List var4 = var3.parseStream();
  54.          ListIterator var5 = var4.listIterator();
  55.  
  56.          Object var6;
  57.          Node var7;
  58.          EvaluationVisitor var13;
  59.          for(var6 = null; var5.hasNext(); var6 = var7.acceptVisitor(var13)) {
  60.             var7 = (Node)var5.next();
  61.             NameVisitor var8 = new NameVisitor(this.nameVisitorContext);
  62.             Object var9 = var7.acceptVisitor(var8);
  63.             if (var9 != null) {
  64.                var7 = (Node)var9;
  65.             }
  66.  
  67.             TypeChecker var12 = new TypeChecker(this.checkVisitorContext);
  68.             var7.acceptVisitor(var12);
  69.             this.evalVisitorContext.defineVariables(this.checkVisitorContext.getCurrentScopeVariables());
  70.             var13 = new EvaluationVisitor(this.evalVisitorContext);
  71.          }
  72.  
  73.          return var6;
  74.       } catch (ExecutionError var10) {
  75.          throw new InterpreterException(var10);
  76.       } catch (ParseError var11) {
  77.          throw new InterpreterException(var11);
  78.       }
  79.    }
  80.  
  81.    public Object interpret(InputStream var1, String var2) throws InterpreterException {
  82.       return this.interpret((Reader)(new InputStreamReader(var1)), var2);
  83.    }
  84.  
  85.    public Object interpret(String var1) throws InterpreterException, IOException {
  86.       return this.interpret((Reader)(new FileReader(var1)), var1);
  87.    }
  88.  
  89.    public void defineVariable(String var1, Object var2) {
  90.       Class var3 = var2 == null ? null : var2.getClass();
  91.       this.nameVisitorContext.define(var1, var3);
  92.       this.checkVisitorContext.define(var1, var3);
  93.       this.evalVisitorContext.define(var1, var2);
  94.    }
  95.  
  96.    public void setVariable(String var1, Object var2) {
  97.       Class var3 = (Class)this.checkVisitorContext.get(var1);
  98.       if (InterpreterUtilities.isValidAssignment(var3, var2)) {
  99.          this.evalVisitorContext.set(var1, var2);
  100.       } else {
  101.          throw new IllegalStateException(var1);
  102.       }
  103.    }
  104.  
  105.    public Object getVariable(String var1) {
  106.       return this.evalVisitorContext.get(var1);
  107.    }
  108.  
  109.    public Class getVariableClass(String var1) {
  110.       return (Class)this.checkVisitorContext.get(var1);
  111.    }
  112.  
  113.    public Set getVariableNames() {
  114.       return this.evalVisitorContext.getCurrentScopeVariableNames();
  115.    }
  116.  
  117.    public Set getClassNames() {
  118.       return this.classLoader.getClassNames();
  119.    }
  120.  
  121.    public void addClassPath(String var1) {
  122.       try {
  123.          this.classLoader.addURL((new File(var1)).toURL());
  124.       } catch (MalformedURLException var3) {
  125.       }
  126.  
  127.    }
  128.  
  129.    public void addClassURL(URL var1) {
  130.       this.classLoader.addURL(var1);
  131.    }
  132.  
  133.    public void addLibraryPath(String var1) {
  134.       this.libraryFinder.addPath(var1);
  135.    }
  136.  
  137.    public void addLibrarySuffix(String var1) {
  138.       this.libraryFinder.addSuffix(var1);
  139.    }
  140.  
  141.    public Class loadClass(String var1) throws ClassNotFoundException {
  142.       return (new TreeCompiler(this)).compile(var1);
  143.    }
  144.  
  145.    public Class defineClass(String var1, byte[] var2) {
  146.       return this.classLoader.defineClass(var1, var2);
  147.    }
  148.  
  149.    public ClassLoader getClassLoader() {
  150.       return this.classLoader;
  151.    }
  152.  
  153.    public LibraryFinder getLibraryFinder() {
  154.       return this.libraryFinder;
  155.    }
  156.  
  157.    public ParserFactory getParserFactory() {
  158.       return this.parserFactory;
  159.    }
  160.  
  161.    public Class getExceptionClass() {
  162.       return class$Lkoala$dynamicjava$interpreter$error$CatchedExceptionError != null ? class$Lkoala$dynamicjava$interpreter$error$CatchedExceptionError : (class$Lkoala$dynamicjava$interpreter$error$CatchedExceptionError = class$("koala.dynamicjava.interpreter.error.CatchedExceptionError"));
  163.    }
  164.  
  165.    public void registerMethod(String var1, MethodDeclaration var2, ImportationManager var3) {
  166.       this.localMethods.add(var1);
  167.       Map var10000 = methods;
  168.       MethodDescriptor var10002 = new MethodDescriptor;
  169.       if (this == null) {
  170.          throw null;
  171.       } else {
  172.          var10002.<init>(this, var2, var3);
  173.          var10000.put(var1, var10002);
  174.       }
  175.    }
  176.  
  177.    public static Object invokeMethod(String var0, Object var1, Object[] var2) {
  178.       MethodDescriptor var3 = (MethodDescriptor)methods.get(var0);
  179.       Class var4 = null;
  180.  
  181.       try {
  182.          var4 = Class.forName(var0.substring(0, var0.lastIndexOf(35)), true, var3.interpreter.getClassLoader());
  183.       } catch (ClassNotFoundException var6) {
  184.          var6.printStackTrace();
  185.       }
  186.  
  187.       return var3.interpreter.interpretMethod(var4, var3, var1, var2);
  188.    }
  189.  
  190.    protected Object interpretMethod(Class var1, MethodDescriptor var2, Object var3, Object[] var4) {
  191.       MethodDeclaration var5 = var2.method;
  192.       List var6 = var5.getParameters();
  193.       List var7 = var5.getBody().getStatements();
  194.       String var8 = var5.getName();
  195.       Object var9 = null;
  196.       if (Modifier.isStatic(var2.method.getAccessFlags())) {
  197.          if (var2.variables == null) {
  198.             var2.importationManager.setClassLoader(this.classLoader);
  199.             StaticContext var10 = new StaticContext(this, var1, var2.importationManager);
  200.             var10.setAdditionalClassLoaderContainer(this.classLoader);
  201.             NameVisitor var11 = new NameVisitor(var10);
  202.             ListIterator var12 = var6.listIterator();
  203.  
  204.             while(var12.hasNext()) {
  205.                ((Node)var12.next()).acceptVisitor(var11);
  206.             }
  207.  
  208.             var12 = var7.listIterator();
  209.  
  210.             while(var12.hasNext()) {
  211.                Object var13 = ((Node)var12.next()).acceptVisitor(var11);
  212.                if (var13 != null) {
  213.                   var12.set(var13);
  214.                }
  215.             }
  216.  
  217.             var10 = new StaticContext(this, var1, var2.importationManager);
  218.             var10.setAdditionalClassLoaderContainer(this.classLoader);
  219.             TypeChecker var30 = new TypeChecker(var10);
  220.             var12 = var6.listIterator();
  221.  
  222.             while(var12.hasNext()) {
  223.                ((Node)var12.next()).acceptVisitor(var30);
  224.             }
  225.  
  226.             var12 = var7.listIterator();
  227.  
  228.             while(var12.hasNext()) {
  229.                ((Node)var12.next()).acceptVisitor(var30);
  230.             }
  231.  
  232.             var2.variables = var10.getCurrentScopeVariables();
  233.             if (!var8.equals("<clinit>") && !var8.equals("<init>")) {
  234.                try {
  235.                   var2.contextField = var1.getField("local$Variables$Reference$0");
  236.                } catch (NoSuchFieldException var20) {
  237.                }
  238.             }
  239.          }
  240.  
  241.          var9 = new StaticContext(this, var1, var2.variables);
  242.       } else {
  243.          if (var2.variables == null) {
  244.             var2.importationManager.setClassLoader(this.classLoader);
  245.             MethodContext var25 = new MethodContext(this, var1, var1, var2.importationManager);
  246.             var25.setAdditionalClassLoaderContainer(this.classLoader);
  247.             NameVisitor var31 = new NameVisitor(var25);
  248.             MethodContext var37 = new MethodContext(this, var1, var1, var2.importationManager);
  249.             var37.setAdditionalClassLoaderContainer(this.classLoader);
  250.             NameVisitor var41 = new NameVisitor(var37);
  251.             Object[][] var14 = null;
  252.  
  253.             try {
  254.                Field var15 = var1.getField("local$Variables$Class$0");
  255.                var14 = var15.get(var3);
  256.  
  257.                for(int var16 = 0; var16 < var14.length; ++var16) {
  258.                   Object[] var17 = var14[var16];
  259.                   if (!((String)var17[0]).equals("this")) {
  260.                      var25.defineConstant((String)var17[0], var17[1]);
  261.                   }
  262.                }
  263.             } catch (Exception var22) {
  264.             }
  265.  
  266.             ListIterator var44 = var6.listIterator();
  267.  
  268.             while(var44.hasNext()) {
  269.                ((Node)var44.next()).acceptVisitor(var31);
  270.             }
  271.  
  272.             var44 = var7.listIterator();
  273.  
  274.             while(var44.hasNext()) {
  275.                Node var48 = (Node)var44.next();
  276.                Object var51 = null;
  277.                if (var48.hasProperty("instanceInitializer")) {
  278.                   var51 = var48.acceptVisitor(var41);
  279.                } else {
  280.                   var51 = var48.acceptVisitor(var31);
  281.                }
  282.  
  283.                if (var51 != null) {
  284.                   var44.set(var51);
  285.                }
  286.             }
  287.  
  288.             var25 = new MethodContext(this, var1, var1, var2.importationManager);
  289.             var25.setAdditionalClassLoaderContainer(this.classLoader);
  290.             TypeChecker var32 = new TypeChecker(var25);
  291.             var37 = new MethodContext(this, var1, var1, var2.importationManager);
  292.             var37.setAdditionalClassLoaderContainer(this.classLoader);
  293.             TypeChecker var42 = new TypeChecker(var37);
  294.             if (var14 != null) {
  295.                for(int var49 = 0; var49 < var14.length; ++var49) {
  296.                   Object[] var53 = var14[var49];
  297.                   if (!((String)var53[0]).equals("this")) {
  298.                      var25.defineConstant((String)var53[0], var53[1]);
  299.                   }
  300.                }
  301.             }
  302.  
  303.             var44 = var6.listIterator();
  304.  
  305.             while(var44.hasNext()) {
  306.                ((Node)var44.next()).acceptVisitor(var32);
  307.             }
  308.  
  309.             var44 = var7.listIterator();
  310.  
  311.             while(var44.hasNext()) {
  312.                Node var50 = (Node)var44.next();
  313.                if (var50.hasProperty("instanceInitializer")) {
  314.                   var50.acceptVisitor(var42);
  315.                } else {
  316.                   var50.acceptVisitor(var32);
  317.                }
  318.             }
  319.  
  320.             var2.variables = var25.getCurrentScopeVariables();
  321.             if (!var8.equals("<clinit>") && !var8.equals("<init>")) {
  322.                try {
  323.                   var2.contextField = var1.getField("local$Variables$Reference$0");
  324.                } catch (NoSuchFieldException var19) {
  325.                }
  326.             }
  327.          }
  328.  
  329.          var9 = new MethodContext(this, var1, var3, var2.variables);
  330.       }
  331.  
  332.       ((Context)var9).setAdditionalClassLoaderContainer(this.classLoader);
  333.       Iterator var27 = var6.iterator();
  334.       int var33 = 0;
  335.  
  336.       while(var27.hasNext()) {
  337.          ((Context)var9).set(((FormalParameter)var27.next()).getName(), var4[var33++]);
  338.       }
  339.  
  340.       if (var2.contextField != null) {
  341.          Map var39 = null;
  342.  
  343.          try {
  344.             var39 = (Map)var2.contextField.get(var3);
  345.          } catch (IllegalAccessException var18) {
  346.          }
  347.  
  348.          if (var39 != null) {
  349.             for(String var43 : var39.keySet()) {
  350.                if (!var43.equals("this")) {
  351.                   ((Context)var9).setConstant(var43, var39.get(var43));
  352.                }
  353.             }
  354.          }
  355.       }
  356.  
  357.       EvaluationVisitor var40 = new EvaluationVisitor((Context)var9);
  358.       var27 = var7.iterator();
  359.  
  360.       try {
  361.          while(var27.hasNext()) {
  362.             ((Node)var27.next()).acceptVisitor(var40);
  363.          }
  364.  
  365.          return null;
  366.       } catch (ReturnException var21) {
  367.          return var21.getValue();
  368.       }
  369.    }
  370.  
  371.    public void registerConstructorArguments(String var1, List var2, List var3, ImportationManager var4) {
  372.       this.localConstructorParameters.add(var1);
  373.       Map var10000 = constructorParameters;
  374.       ConstructorParametersDescriptor var10002 = new ConstructorParametersDescriptor;
  375.       if (this == null) {
  376.          throw null;
  377.       } else {
  378.          var10002.<init>(this, var2, var3, var4);
  379.          var10000.put(var1, var10002);
  380.       }
  381.    }
  382.  
  383.    public static Object[] interpretArguments(String var0, Object[] var1) {
  384.       ConstructorParametersDescriptor var2 = (ConstructorParametersDescriptor)constructorParameters.get(var0);
  385.       Class var3 = null;
  386.  
  387.       try {
  388.          var3 = Class.forName(var0.substring(0, var0.lastIndexOf(35)), true, var2.interpreter.getClassLoader());
  389.       } catch (ClassNotFoundException var5) {
  390.          var5.printStackTrace();
  391.       }
  392.  
  393.       return var2.interpreter.interpretArguments(var3, var2, var1);
  394.    }
  395.  
  396.    protected Object[] interpretArguments(Class var1, ConstructorParametersDescriptor var2, Object[] var3) {
  397.       if (var2.variables == null) {
  398.          var2.importationManager.setClassLoader(this.classLoader);
  399.          StaticContext var4 = new StaticContext(this, var1, var2.importationManager);
  400.          var4.setAdditionalClassLoaderContainer(this.classLoader);
  401.          NameVisitor var5 = new NameVisitor(var4);
  402.          TypeChecker var6 = new TypeChecker(var4);
  403.          if (var2.parameters != null) {
  404.             ListIterator var7 = var2.parameters.listIterator();
  405.  
  406.             while(var7.hasNext()) {
  407.                ((Node)var7.next()).acceptVisitor(var6);
  408.             }
  409.          }
  410.  
  411.          if (var2.arguments != null) {
  412.             ListIterator var15 = var2.arguments.listIterator();
  413.  
  414.             while(var15.hasNext()) {
  415.                Node var8 = (Node)var15.next();
  416.                Object var9 = var8.acceptVisitor(var5);
  417.                if (var9 != null) {
  418.                   var15.set(var9);
  419.                }
  420.             }
  421.  
  422.             var15 = var2.arguments.listIterator();
  423.  
  424.             while(var15.hasNext()) {
  425.                ((Node)var15.next()).acceptVisitor(var6);
  426.             }
  427.          }
  428.  
  429.          var2.variables = var4.getCurrentScopeVariables();
  430.       }
  431.  
  432.       StaticContext var10 = new StaticContext(this, var1, var2.variables);
  433.       var10.setAdditionalClassLoaderContainer(this.classLoader);
  434.       if (var2.parameters != null) {
  435.          Iterator var11 = var2.parameters.iterator();
  436.          int var13 = 0;
  437.  
  438.          while(var11.hasNext()) {
  439.             var10.set(((FormalParameter)var11.next()).getName(), var3[var13++]);
  440.          }
  441.       }
  442.  
  443.       Object[] var12 = new Object[0];
  444.       if (var2.arguments != null) {
  445.          EvaluationVisitor var14 = new EvaluationVisitor(var10);
  446.          ListIterator var17 = var2.arguments.listIterator();
  447.          var12 = new Object[var2.arguments.size()];
  448.  
  449.          for(int var18 = 0; var17.hasNext(); var12[var18++] = ((Node)var17.next()).acceptVisitor(var14)) {
  450.          }
  451.       }
  452.  
  453.       return var12;
  454.    }
  455.  
  456.    protected void finalize() throws Throwable {
  457.       Iterator var1 = this.localMethods.iterator();
  458.  
  459.       while(var1.hasNext()) {
  460.          methods.remove(var1.next());
  461.       }
  462.  
  463.       var1 = this.localConstructorParameters.iterator();
  464.  
  465.       while(var1.hasNext()) {
  466.          constructorParameters.remove(var1.next());
  467.       }
  468.  
  469.    }
  470.  
  471.    // $FF: synthetic method
  472.    static Class class$(String var0) {
  473.       try {
  474.          return Class.forName(var0);
  475.       } catch (ClassNotFoundException var2) {
  476.          throw new NoClassDefFoundError(((Throwable)var2).getMessage());
  477.       }
  478.    }
  479.  
  480.    public TreeInterpreter(ParserFactory var1) {
  481.       this.parserFactory = var1;
  482.       this.classLoader = new TreeClassLoader(this);
  483.       this.nameVisitorContext = new GlobalContext(this);
  484.       this.nameVisitorContext.setAdditionalClassLoaderContainer(this.classLoader);
  485.       this.checkVisitorContext = new GlobalContext(this);
  486.       this.checkVisitorContext.setAdditionalClassLoaderContainer(this.classLoader);
  487.       this.evalVisitorContext = new GlobalContext(this);
  488.       this.evalVisitorContext.setAdditionalClassLoaderContainer(this.classLoader);
  489.    }
  490. }
  491.